Oktobar 2008, rešeni rok iz predmeta "Baze podataka"


fajlovi prikačeni uz rok.

U arhivi se nalaze: XML schema (.xsd), XML dokument (.xml), XQuery upit ili XPath putanja (.xq), SQl dump baze (.sql), visio 2003 dijagram (.vsd) ukoliko postoje takvi fajlovi vezani za zadatke.

XML: za sve fajlove je provereno da li su dobro oformljeni, a ako postoji i xml fajl i schema, xml fajl je validiran u odnosu na odgovarajuću šemu. Za kreiranje fajlova, proveru forme, validaciju, XPath i XQuery izraze korišćen je XML editor EditX http://www.editix.com/

SQL: baza je napravljena u MySQL-u pa prema tome SQL kod može imati netipičnu sintaksu ili funkcije različite od onih u knjizi. Upiti su provereni, prema mom shvatanju zadataka, koji često nisu baš lako shvatljivi. Najlakše je preko MySQLyog-a uraditi "restore from SQL dump" da bi mogli da probate upite nad podacima. Alati: MySQL http://www.mysql.com, MySQOyog www.webyog.com


1. zadatak

relacija:

UčesnikTrke (ŠifraTrke, OlimpijskiBroj, NazivTrke, RBStaze, ImePrezimeTrkača, ŠifraDržave, NazivDržave)

funkcionalne zavisnosti:

ŠifraTrke, OlimpijskiBroj --> RBStaze, ŠifraDržave, NazivDržave, NazivTrke, ImePrezimeTrkača
ŠifraTrke --> NazivTrke
OlimpijskiBroj --> ImePrezimeTrkača, ŠifraDržave, NazivDržave
ŠifraDržave --> NazivDržave

Relacija je u Boyce-Codd normalnoj formi ako su sve determinante ujedno i kandidati za ključ.

Determinanta je atribut ili skup atributa od kojih neki drugi atribut ili skup atributa potpuno funkcionalno zavisi.

determinante:

ŠifraTrke, OlimpijskiBroj --> RBStaze(D)(KK)
ŠifraTrke --> NazivTrke(D)
OlimpijskiBroj --> ImePrezimeTrkača, ŠifraDržave, NazivDržave(D)
ŠifraDržave --> NazivDržave(D)

Očigledno relacija nije u Boyce-Codd normalnoj formi, pa je potrebno relaciju dekomponovati, tako da se dobiju relacije u kojima su kandidati za ključ one relacije koje su determinante u polaznoj relaciji:

Trkač(OlimpijskiBroj,ŠifraDržave)
Država(ŠifraDržave, NazivDržave)
Trka(ŠifraTrke, NazivTrke)
MestoUTrci(ŠifraTrke, OlimpijskiBroj, RBStaze)


2. zadatak

a)

A (A1#, A2, B)

B (B1#, B2)

AB1 (B1#, A1#)

D (A1#, D1)

G (G1#, G2)

H (B1#, A1#, G1#, H1)

C (B1#, C1)

E (G1#, E1)

F (G1#, F1)

FF (G1#, G1#)

b)

class B (extent Bs key B1#){

	attribute string B1#;
	attribute string B2;
	relationship A BA1 inverse A :: AB1;
	relationship set<A> BA2 inverse A :: AB2;
	attribute set<C> Cs;

};

class C {

	attribute string C1;

};

class D extends A{

	attribute string D1;
	relationship set<H> DH inverse H :: HD;

};

class G (extent Gs key G1#){

	attribute string G1#;
	attribute string G2;
	relationship set<H> Gh inverse H :: HG; 

};

class H {

	attribute string H1;
	relationship B HB inverse B :: BH;
	relationship D HD inverse D :: DH;
	relationship G HG inverse G :: GH;

};

3. zadatak

Spoljno spajanje se koristi kako bi se u rezultat spajanja uključili i oni redovi koji ne zadovoljavaju uslov spajanja.

Za ilustraciju ćemo koristiti sledeće tabele:

Odeljenje

ŠifraOdeljenjaNazivOdeljenja
1Uprava
2Računski centar
3Proizvodnja

Radnik

ŠifraRadnikaImePrezimeŠifraOdeljenja
1000Pera Perić1
1001Marko Marković1
1002Žika Žikić2
1003Laza Lazić2
1004Petar Petrović

4. zadatak

Složeni konstruisani tipovi u objektno-relacionom bp su tip vrsta i tip kolekcija.


5. zadatak

Kod vremenskog obeležavanja transakcija, transakcije na početku izvršavanja dobiju redni broj, tako da se kasnije zna koja je transakcija starija. Konflikt nastaje kada transakcija hoće da čita neki slog koji je mladja transakcija vec ažurirala, ili hoće da ažurira slog koji je mladja transakcija vec ažurirala ili videla. Konflikti se razrešavaju ponovnim startovanjem starije transakcije.

postoje dva identifikatora koji se zadaju svakom objektu baze podataka:

RMAX - najveća identifikacija transakcije koja je pročitala objekat
UMAX - najveća identifikacija transakcije koja je ažurirala objekat

čitanje:

if(t>=UMAX){
	operacija se prihvata;
	RMAX = max(t, RMAX);
}else{
	konflikt;
	restart T;
}       	

ažuriranje:

if(t>=RMAX && t>=UMAX){
	operacija se prihvata;
	UMAX = t;
}else{
	konflikt;
	restart T;
}     	

6. zadatak

a)

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
	elementFormDefault="qualified"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="
		http://www.w3.org/2001/XMLSchema
		http://www.w3.org/2001/XMLSchema.xsd"
	targetNamespace="www.nemanjakovacevic.com/bazepodataka/okt2008"
	xmlns="www.nemanjakovacevic.com/bazepodataka/okt2008">
	<xsd:element name="model">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="Dobavljac" type="DobavljacTip" minOccurs="0" maxOccurs="unbounded"/>
				<xsd:element name="Narudzbenica" type="NarudzbenicaTip" minOccurs="0" maxOccurs="unbounded"/>
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>
	
	<xsd:complexType name="DobavljacTip">
		<xsd:attribute name="SifraDob" type="xsd:ID" use="required"/>
		<xsd:attribute name="NazivDob" type="xsd:string" />
		<xsd:attribute name="AdresaDob" type="xsd:string"/>
	</xsd:complexType>
	
	<xsd:complexType name="NarudzbenicaTip">
		<xsd:sequence>
			<xsd:element name="StavkaNar" maxOccurs="unbounded">
				<xsd:complexType>
					<xsd:attribute name="RedniBroj" type="xsd:integer" use="required"/>
					<xsd:attribute name="Proizvod" type="xsd:string" />
					<xsd:attribute name="Kolicina" type="xsd:integer"/>
					<xsd:attribute name="Vrednost" type="xsd:double"/>
					<xsd:attribute name="Valuta" type="xsd:string" default="din"/>
				</xsd:complexType>
			</xsd:element>
		</xsd:sequence>
		<xsd:attribute name="BrojNarDob" type="xsd:ID" use="required"/>
		<xsd:attribute name="SifraDob" type="xsd:IDREF" use="required"/>
	</xsd:complexType>
	
</xsd:schema>

b)

<?xml version="1.0" encoding="utf-8"?>
<model
	xmlns="www.nemanjakovacevic.com/bazepodataka/okt2008"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="www.nemanjakovacevic.com/bazepodataka/okt2008 file:///D:/My%20FON/IV%20godina/I%20semestar/Baze%20podataka/BProkovi2008/okt2008/podA.xsd">
	
	<Dobavljac SifraDob="D1" NazivDob="Logitech"/>
	<Dobavljac SifraDob="D2" NazivDob="Canon"/>
	<Dobavljac SifraDob="D3" NazivDob="XYZ"/>
	
	<Narudzbenica BrojNarDob="N11" SifraDob="D1">
		<StavkaNar RedniBroj="1" Proizvod="Logitech MX Revolution" Kolicina="1" Vrednost="7800"/>
		<StavkaNar RedniBroj="2" Proizvod="Logitech Deluxe Keyboard" Kolicina="1" Vrednost="800"/>
		<StavkaNar RedniBroj="3" Proizvod="Logitech X 230" Kolicina="1" Vrednost="3500"/>
		<StavkaNar RedniBroj="4" Proizvod="A" Kolicina="1" Vrednost="3500"/>
		<StavkaNar RedniBroj="5" Proizvod="B" Kolicina="1" Vrednost="3500"/>
	</Narudzbenica>
	
	<Narudzbenica BrojNarDob="N21" SifraDob="D2">
		<StavkaNar RedniBroj="1" Proizvod="Canon MP 180" Kolicina="1" Vrednost="8800"/>
		<StavkaNar RedniBroj="2" Proizvod="Canon MX 300" Kolicina="1" Vrednost="10000"/>
	</Narudzbenica>
	
	<Narudzbenica BrojNarDob="N31" SifraDob="D3">
		<StavkaNar RedniBroj="1" Proizvod="A" Kolicina="1" Vrednost="3500"/>
		<StavkaNar RedniBroj="2" Proizvod="B" Kolicina="1" Vrednost="3500"/>
	</Narudzbenica>


</model>	

c)

for 
	$x in doc("podB.xml")/model/Narudzbenica
where  
	$x/@SifraDob=/model/Dobavljac[@NazivDob="XYZ"]/@SifraDob
and
	$x/StavkaNar[@Proizvod="A"]
and 
	$x/StavkaNar[@Proizvod="B"]
return 
	$x	

7. zadatak

a)

select 
	LokacijaID
from 
	Lokacija join PopisnaLista using(LokacijaID) join StavkaPopisneListe using(ListaID)
where
	extract(year from DatumPopisa) = 2007 and TipLokacije = 'Proizvodni pogon'
group by
	LokacijaID
having
	sum(case when PopisanaKol = 0 then 1 else 0 end) > 0

b)

select
	LokacijaID, Lokacija.Naziv, AmortizacionaGrupa, min(NabavnaVrednost)
from
	Lokacija join PopisnaLista using(LokacijaID) join StavkaPopisneListe using(ListaID) join OsnovnoSredstvo using(InventarniBroj)
group by
	LokacijaID, Naziv, AmortizacionaGrupa
order by
	LokacijaID desc

c)

select distinct
	Naziv
from
	OsnovnoSredstvo join StavkaPopisneListe using(InventarniBroj) join PopisnaLista using(ListaID)
where
	extract(year from DatumPopisa) = 2008 and AmortizacionaGrupa = 'Kompjuterska oprema' 
	and Naziv not in
		(select distinct
			Naziv
		from
			OsnovnoSredstvo join StavkaPopisneListe using(InventarniBroj) join PopisnaLista using(ListaID)
		where
			extract(year from DatumPopisa) = 2007 and AmortizacionaGrupa = 'Kompjuterska oprema')

8. zadatak